package classes;

import java.util.ArrayList;

import competences.ECompetence;

import data.ECaracteristique;
import data.JetsDeSauvegarde;
import dons.EDons;
import magie.Magie;

public class Barde extends Classe {

	private Magie magie;
	
	public Barde (int pourcCombattant) {
		super();
		
		magie = new Magie(this.getClass(), pourcCombattant);
		
	}
	
	public Barde() {
		super();
		
		magie = new Magie(this.getClass(), 50);
		
	}
	
	@Override
	protected void ajoutCaracFavorables() {
		caracFavorable.add(ECaracteristique.INT);
		caracFavorable.add(ECaracteristique.CHA);
	}

	@Override
	protected void ajoutCompetencesDeClasse() {
		bonusCompetence = 6;
		competenceDeClasse.add(ECompetence.Acrobatie);
		competenceDeClasse.add(ECompetence.Artisanat);
		competenceDeClasse.add(ECompetence.Bluff);
		competenceDeClasse.add(ECompetence.Concentration);	
		competenceDeClasse.add(ECompetence.Connaissance_des_sorts);
		competenceDeClasse.add(ECompetence.ConnaissanceFolkloreLocal);
		competenceDeClasse.add(ECompetence.Decryptage);
		competenceDeClasse.add(ECompetence.Deguisement);
		competenceDeClasse.add(ECompetence.DeplacementSilencieux);	
		competenceDeClasse.add(ECompetence.Diplomatie);
		competenceDeClasse.add(ECompetence.Discretion);
		competenceDeClasse.add(ECompetence.Equilibre);
		competenceDeClasse.add(ECompetence.Escalade);	
		competenceDeClasse.add(ECompetence.Estimation);
		competenceDeClasse.add(ECompetence.Evasion);
		competenceDeClasse.add(ECompetence.Langue);	
		competenceDeClasse.add(ECompetence.Natation);
		competenceDeClasse.add(ECompetence.PerceptionAuditive);
		competenceDeClasse.add(ECompetence.Profession);
		competenceDeClasse.add(ECompetence.Psychologie);
		competenceDeClasse.add(ECompetence.Renseignement);
		competenceDeClasse.add(ECompetence.Representation);	
		competenceDeClasse.add(ECompetence.Saut);
		competenceDeClasse.add(ECompetence.UtilisationDesObjetsMagiques);
		competenceDeClasse.add(ECompetence.VolALaTire);
	}

	private int[] CreateTabSortClasse (){
		int[] nbSort = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
		int i;
		int niveauMax = (this.niveau+2)/3;
		
		if (this.niveau == 1)
			nbSort[0]=2;
		if(this.niveau==2){
			nbSort[0]=3;
			nbSort[1]=0;
		}
		else if (this.niveau==3){
			nbSort[0]=3;
			nbSort[1]=1;
		}
		else if ((this.niveau<=18) && (this.niveau%3==0)){
			for(i=0; i<niveauMax;i++)
				nbSort[i]=3;
			for(i=0; i<niveauMax-4;i++)
				nbSort[i]=4;
			nbSort[niveauMax] = 2;
		}
		else if ((this.niveau<=18) && (this.niveau%3==1)){
			for(i=0; i<niveauMax-1;i++)
				nbSort[i]=3;
			nbSort[niveauMax-1] = 2;
			nbSort[niveauMax] = 0;
		}
		else if ((this.niveau<=18) && (this.niveau%3==2)){
			for(i=0; i<niveauMax;i++)
				nbSort[i]=3;
			nbSort[niveauMax] = 1;		
		}
		else if (this.niveau==19)
			nbSort[6] = 3;
		
		for(i=14; i<this.niveau+1; i++)
			nbSort[i-14]=4;
		
		return nbSort;
	}
	
	private int[] CreateTabSortConnu (){
		int[] nbSort = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
		int i;
		int niveauMax = (this.niveau+2)/3;
		
		if(this.niveau==1)
			nbSort[0]=4;
		else if (this.niveau==2){
			nbSort[0]=5;
			nbSort[1]=2;
		}
		else if (this.niveau==3){
			nbSort[0]=6;
			nbSort[1]=3;
		}
		else if (this.niveau==4){
			nbSort[0]=6;
			nbSort[1]=3;
			nbSort[2]=2;
		}
		else
			nbSort[0]=6;
		
		if((this.niveau>4) && (this.niveau<19)){
			if (this.niveau%3 == 1)
				nbSort[niveauMax]=2;
			else
				nbSort[niveauMax]=3;
		}
		if(this.niveau>4){
			for(i=1; i<niveauMax; i++)
				nbSort[i]=4;
			for(i=1; i<(this.niveau-14); i++)
				nbSort[i]=5;
		}
		
		
		return nbSort;
	}
	
	
	@Override
	public void AdjustSort (int[] carac){
		int[] nbSortParJour = this.CreateTabSortClasse();	
		int[] nbSortConnu = this.CreateTabSortConnu ();
		int[] nbSortConnuActuel = this.magie.getNbSort();
		int i, caracImp = carac[ECaracteristique.CHA.ordinal()];
		
		for(i=0; i<7; i++){
			//limitation du a la valeur d'intelligence
			if(i>caracImp-10)
				nbSortParJour[i]=-1;
			//ajout du au modif de charisme
			if((((caracImp-10)/2)>=i) && (i!=0) && (nbSortParJour[i]!=-1))
				nbSortParJour[i] ++;
			if(((((caracImp-10)/2)-4)>=i) && (i!=0) && (nbSortParJour[i]!=-1))
				nbSortParJour[i] ++;
			if(((((caracImp-10)/2)-8)>=i) && (i!=0) && (nbSortParJour[i]!=-1))
				nbSortParJour[i] ++;	
			if(((((caracImp-10)/2)-12)>=i) && (i!=0) && (nbSortParJour[i]!=-1))
				nbSortParJour[i] ++;				
			
			if(nbSortConnuActuel[i]<nbSortConnu[i])
				this.magie.AddSort(nbSortConnu[i]-nbSortConnuActuel[i], i);
		}
		this.magie.UpdateNbSortParJour(nbSortParJour);
				
	}
		
	@Override
	public void levelUp() {
		super.niveau++;
		
		super.setBBASemiCombattant();
		super.setJdS(JetsDeSauvegarde.Volonte, JetsDeSauvegarde.Reflexe);
	}
	
	@Override
	public String toString() {
		return "Barde\n" + super.toString() + "\n" + this.magie;
	}

}
